package org.funtester.performance.books.chapter03.section7;

import org.funtester.performance.books.chapter03.common.ThreadTool;
import org.funtester.performance.books.chapter03.section3.ThreadTask;

import java.util.ArrayList;
import java.util.concurrent.atomic.AtomicLong;

/**
 * 超市收银台性能测试用例
 */
public class SupermarketCheckoutTaskFirst extends ThreadTask {

    /**
     * 计价耗时统计
     */
    public static AtomicLong priceCostTime;

    /**
     * 支付耗时统计
     */
    public static AtomicLong payCostTime;

    /**
     * 打包耗时统计
     */
    public static AtomicLong packCostTime;

    /**
     * 构造方法
     * @param totalNum 执行的总次数
     */
    public SupermarketCheckoutTaskFirst(int totalNum) {
        this.totalNum = totalNum;// 设置执行的总次数
        this.costTime = new ArrayList<>(totalNum);// 初始化耗时收集集合类容量
        priceCostTime = new AtomicLong();// 初始化计价耗时统计
        payCostTime = new AtomicLong();// 初始化支付耗时统计
        packCostTime = new AtomicLong();// 初始化打包耗时统计
    }

    /**
     * 业务操作,计价、支付、打包
     */
    @Override
    public void test() {
        long start = System.currentTimeMillis();
        price();
        long price = System.currentTimeMillis();
        priceCostTime.addAndGet(price - start);// 计价耗时统计
        pay();
        long pay = System.currentTimeMillis();
        payCostTime.addAndGet(pay - price);// 支付耗时统计
        pack();
        long pack = System.currentTimeMillis();
        packCostTime.addAndGet(pack - pay);// 打包耗时统计
    }

    /**
     * 计价
     */
    public void price() {
        // 顾客扫码计价阶段
        ThreadTool.sleep(10);
    }

    /**
     * 支付
     */
    public void pay() {
        // 顾客支付阶段
        ThreadTool.sleep((int) (System.currentTimeMillis() % 10000) / 100);
    }

    /**
     * 打包
     */
    public void pack() {
        // 顾客打包阶段
        ThreadTool.sleep(10);
    }

}
